package com.space.school.controller;


import com.space.school.service.LoginService;
import com.space.school.service.impl.LoginServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

//前端通过这个注解来访问后端
@WebServlet(name = "loginServlet",value = "/loginServlet")
public class LoginServlet extends HttpServlet {
    private LoginService loginService = new LoginServiceImpl();
    //    doGet方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        跳转到登录页面
//        getRequestDispatcher进行一个页面跳转
//        req.getRequestDispatcher(页面名称).forward(请求,响应)
        req.getRequestDispatcher("login.jsp").forward(req,resp);
    }
//    url是地址
// doGet doPost区 别
//    1.参数传递方式不同
//    get请求和post请求区别
//    Get请求特点:参数是通过url的查询字符串以键值对的形式附加在url后面
//    get的请求参数长度是有限制的,一般不适合传递大量的数据

//    post请求 参数是以form(表单)的形式放在请求中进行传递的
//    而不会直接暴露在url
//    post 适用于传输大量数据

//    2.安全性
//    get 会将参数直接显示在url中 不适用传递敏感数据
//    post 不会将参数直接显示在url中 安全性较高

//    3.缓存
//    Get请求 具体缓存性的,浏览器会自动缓存get请求的响应结果
//    当再次发送相同的get请求,直接从缓存中获取响应,提高性能
//    post请求,没有缓存性,每次都需要想服务器发送请求

//    4.幂等性
//    GET 请求:get请求是幂等的,即多次执行相同的Get 请求,不会对服务器产生影响,也不会改变资源状态
//    POST 请求:Post 请求不具备幂等性,多次执行相同的POST 请求可能会导致服务器上的资源状态发生变化

//    HttpServletRequest 网络服务的请求
//    Servlet 小型服务
//    代表客户端的请求
//    HttpServletRequest 对象封装了 客户端发送给服务器的http请求的所有信息,并将这些信息参数传递给servlet的doget dopost方法

//    HttpServletResponse 响应
//    代表服务器对客户端的响应,当Servlet 处理完客户端的请求后
//    需要向客户端发送响应,我们设置了响应码头,响应码体,响应状态码


//    Cookie Session
//    Cookie 存储在浏览器上的一小块数据
//    它会在浏览器后续请求同一个web服务器时候
//    被携带发送给服务器上
//    用途:识别用户,跟踪用户状态,存储用户偏好设置
//    安全性:Cookie 存在客户端,容易被发现或者修改,因此储存不敏感信息
//    大小限制:大多数浏览器的大小限制为4kb
//    生命周期:可以设置Cookie过期时间,一旦过期,浏览器会自动清除
//    如果未设置时间,Cookie会在浏览器会话结束时失效(关闭浏览器)

//    Session
//    是存储在服务器上的,用于跟踪用户会话状态,每个用户都有自己的Session
//    用途:用于跨多个页面请求和访问之间保持用户状态信息
//    安全性:存储在服务器端,相对安全
//    大小限制:没有限制
//    生命周期:可以跨多个请求,知道Session超时或被服务器回收






    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        设定取出值的编码格式
        req.setCharacterEncoding("UTF-8");
//        getParameter获取参数
        String username = req.getParameter("userName");
//        取的是name中的值
        String password = req.getParameter("passWord");
//      已经取出账户密码

//        取出验证码
        String verifyCode = req.getParameter("verifycode");
//        验证码校验
        HttpSession session = req.getSession();
        String checkCode = (String) session.getAttribute("checkCode");
//        移除 checkCode
        session.removeAttribute("checkCode");
        if(!verifyCode.equals(checkCode)){
            req.getSession().setAttribute("login_message","验证码错误");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
        boolean flag_username = loginService.login_username(username);
        boolean flag = loginService.login(username,password);


        if (flag_username){
            if(flag){

//                Cookie
//                Cookie cookie = new Cookie("username",username);
////                设置时间  单位:秒
//                cookie.setMaxAge(30);
////                没设置时间
//                resp.addCookie(cookie);

//                Session
//                声明一个Session (无参数)
//                HttpSession session = req.getSession();
                session.setAttribute("username",username);


                req.getSession().setAttribute("username",username);
//            跳转到系统主页面
                req.getRequestDispatcher("list.jsp").forward(req,resp);
            }else {
//                单纯的传信息并不会跳转界面
                req.getSession().setAttribute("login_message","密码错误");
//            跳转到登录页
                req.getRequestDispatcher("login.jsp").forward(req,resp);
            }
        }else {
            req.getSession().setAttribute("login_message","你未注册");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }

}
